Pythonã§ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ãå®è£ ããèé害æ§ãšå埩åã®ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæ¹æ³ãåŠã³ãŸããã«ã¹ã±ãŒãé害ãé²ããã·ã¹ãã å®å®æ§ãåäžãããŸãã
PythonãµãŒããããã¬ãŒã«ãŒïŒèé害æ§ã®ããã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯
忣ã·ã¹ãã ãšãã€ã¯ããµãŒãã¹ã®åéã§ã¯ãé害ãžã®å¯Ÿå¿ã¯é¿ããããŸããããµãŒãã¹ã¯ããããã¯ãŒã¯ã®åé¡ããµãŒããŒã®éè² è·ããŸãã¯äºæããªããã°ãåå ã§å©çšã§ããªããªãå¯èœæ§ããããŸããé害ãçºçããŠãããµãŒãã¹ãé©åã«åŠçãããªããšãã«ã¹ã±ãŒãé害ã«ã€ãªãããã·ã¹ãã å šäœãããŠã³ããå¯èœæ§ããããŸãããµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ã¯ããããã®ã«ã¹ã±ãŒãé害ãé²ããããå埩åã®ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªææ³ã§ãããã®èšäºã§ã¯ãPythonã§ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ãå®è£ ããããã®å æ¬çãªã¬ã€ããæäŸããŸãã
ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ãšã¯ïŒ
黿°ã®ãµãŒããããã¬ãŒã«ãŒã«è§ŠçºããããµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ã¯ã倱æããå¯èœæ§ã®ããæäœã®ãããã·ãšããŠæ©èœããŸãããããã®æäœã®æåçãšå€±æçãç£èŠããäžå®ã®å€±æãããå€ã«éãããšããµãŒãããããããªãããããŠã倱æããŠãããµãŒãã¹ãžã®ãããªãåŒã³åºããé²ããŸããããã«ããã倱æããŠãããµãŒãã¹ã¯ããªã¯ãšã¹ãã«ãã£ãŠéè² è·ã«ãªãããšãªãå埩ããæéã皌ããåŒã³åºãå ã®ãµãŒãã¹ã¯ãããŠã³ããŠããããšãããã£ãŠãããµãŒãã¹ãžã®æ¥ç¶ã詊ã¿ããªãœãŒã¹ã®æµªè²»ãé²ããŸãã
ãµãŒããããã¬ãŒã«ãŒã«ã¯ãäž»ã«3ã€ã®ç¶æ ããããŸãã
- ClosedïŒã¯ããŒãºãïŒïŒãµãŒããããã¬ãŒã«ãŒã¯éåžžã®ç¶æ ã§ãåŒã³åºããä¿è·ãããŠãããµãŒãã¹ã«ééãããŸãããããã®åŒã³åºãã®æåãšå€±æãç£èŠããŸãã
- OpenïŒãªãŒãã³ïŒïŒãµãŒããããã¬ãŒã«ãŒã¯ããªãããããŠãããä¿è·ãããŠãããµãŒãã¹ãžã®ãã¹ãŠã®åŒã³åºãããããã¯ãããŸããæå®ãããã¿ã€ã ã¢ãŠãæéã®åŸããµãŒããããã¬ãŒã«ãŒã¯Half-Openç¶æ ã«ç§»è¡ããŸãã
- Half-OpenïŒããŒããªãŒãã³ïŒïŒãµãŒããããã¬ãŒã«ãŒã¯ãä¿è·ãããŠãããµãŒãã¹ãžã®éå®çãªãã¹ãåŒã³åºããèš±å¯ããŸãããããã®åŒã³åºããæåãããšããµãŒããããã¬ãŒã«ãŒã¯Closedç¶æ ã«æ»ããŸãã倱æãããšãOpenç¶æ ã«æ»ããŸãã
ç°¡åãªäŸãã§èª¬æããŸããããATMããçŸéãåŒãåºãããšããŠãããšæ³åããŠãã ãããATMãç¹°ãè¿ãçŸéãåŒãåºããªãå ŽåïŒããããéè¡ã®ã·ã¹ãã ãšã©ãŒã®ããïŒããµãŒããããã¬ãŒã«ãŒãä»å ¥ããŸãã倱æããå¯èœæ§ãé«ãåŒã³åºããç¶ç¶ããŠè©Šã¿ã代ããã«ããµãŒããããã¬ãŒã«ãŒã¯ãããªã詊ã¿ãäžæçã«ãããã¯ããŸãïŒOpenç¶æ ïŒããã°ãããããšãåäžã®åŒãåºã詊è¡ãèš±å¯ããå¯èœæ§ããããŸãïŒHalf-Openç¶æ ïŒããã®è©Šè¡ãæåãããšããµãŒããããã¬ãŒã«ãŒã¯éåžžã®æäœïŒClosedç¶æ ïŒãåéããŸãã倱æãããšããµãŒããããã¬ãŒã«ãŒã¯ããé·ãæéOpenç¶æ ã«ãšã©ãŸããŸãã
ãµãŒããããã¬ãŒã«ãŒã䜿çšããçç±
ãµãŒããããã¬ãŒã«ãŒãå®è£ ãããšãããã€ãã®å©ç¹ããããŸãã
- ã«ã¹ã±ãŒãé害ã®é²æ¢ïŒé害ãçºçããŠãããµãŒãã¹ãžã®åŒã³åºãããããã¯ããããšã«ããããµãŒããããã¬ãŒã«ãŒã¯ãé害ãã·ã¹ãã ã®ä»ã®éšåã«åºããã®ãé²ããŸãã
- ã·ã¹ãã å埩åã®åäžïŒãµãŒããããã¬ãŒã«ãŒã¯ãé害ãçºçããŠãããµãŒãã¹ããªã¯ãšã¹ãã«ãã£ãŠéè² è·ã«ãªãããšãªãå埩ããæéã皌ããããå®å®ããå埩åã®ããã·ã¹ãã ã«ã€ãªãããŸãã
- ãªãœãŒã¹æ¶è²»ã®åæžïŒé害ãçºçããŠãããµãŒãã¹ãžã®äžèŠãªåŒã³åºããåé¿ããããšã«ããããµãŒããããã¬ãŒã«ãŒã¯ãåŒã³åºãå ãšåŒã³åºãããåŽã®äž¡æ¹ã®ãµãŒãã¹ã§ãªãœãŒã¹æ¶è²»ãåæžããŸãã
- ãã©ãŒã«ããã¯ã¡ã«ããºã ã®æäŸïŒãµãŒãããããªãŒãã³ããŠããå ŽåãåŒã³åºãå ãµãŒãã¹ã¯ããã£ãã·ã¥ãããå€ã®è¿åŽããšã©ãŒã¡ãã»ãŒãžã®è¡šç€ºãªã©ã®ãã©ãŒã«ããã¯ã¡ã«ããºã ãå®è¡ã§ããããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããŸãã
Pythonã§ã®ãµãŒããããã¬ãŒã«ãŒã®å®è£
Pythonã§ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ãå®è£ ããã«ã¯ãããã€ãã®æ¹æ³ããããŸããç¬èªã®âå®è£ ããŒãããæ§ç¯ããããšãããµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšããããšãã§ããŸããããã§ã¯ãäž¡æ¹ã®æ¹æ³ãæ¢ããŸãã
1. ã«ã¹ã¿ã ãµãŒããããã¬ãŒã«ãŒã®æ§ç¯
ã³ã¢ã³ã³ã»ãããçè§£ããããã«ãåºæ¬çãªã«ã¹ã¿ã å®è£
ããå§ããŸãããããã®äŸã§ã¯ãã¹ã¬ããã»ãŒãã®ããã«threadingã¢ãžã¥ãŒã«ãã¿ã€ã ã¢ãŠãã®åŠçã®ããã«timeã¢ãžã¥ãŒã«ã䜿çšããŠããŸãã
import time
import threading
class CircuitBreaker:
def __init__(self, failure_threshold, recovery_timeout):
self.failure_threshold = failure_threshold
self.recovery_timeout = recovery_timeout
self.state = "CLOSED"
self.failure_count = 0
self.last_failure_time = None
self.lock = threading.Lock()
def call(self, func, *args, **kwargs):
with self.lock:
if self.state == "OPEN":
if time.time() - self.last_failure_time > self.recovery_timeout:
self.state = "HALF_OPEN"
else:
raise CircuitBreakerError("Circuit breaker is open")
try:
result = func(*args, **kwargs)
self.reset()
return result
except Exception as e:
self.record_failure()
raise e
def record_failure(self):
with self.lock:
self.failure_count += 1
self.last_failure_time = time.time()
if self.failure_count >= self.failure_threshold:
self.state = "OPEN"
print("Circuit breaker opened")
def reset(self):
with self.lock:
self.failure_count = 0
self.state = "CLOSED"
print("Circuit breaker closed")
class CircuitBreakerError(Exception):
pass
# Example Usage
def unreliable_service():
# Simulate a service that sometimes fails
import random
if random.random() < 0.5:
raise Exception("Service failed")
else:
return "Service successful"
circuit_breaker = CircuitBreaker(failure_threshold=3, recovery_timeout=10)
for i in range(10):
try:
result = circuit_breaker.call(unreliable_service)
print(f"Call {i+1}: {result}")
except CircuitBreakerError as e:
print(f"Call {i+1}: {e}")
except Exception as e:
print(f"Call {i+1}: Service failed: {e}")
time.sleep(1)
説æïŒ
CircuitBreakerã¯ã©ã¹ïŒ__init__(self, failure_threshold, recovery_timeout): 倱æãããå€ïŒãµãŒããããããªããããåã®å€±æåæ°ïŒãå埩ã¿ã€ã ã¢ãŠãïŒããŒããªãŒãã³ç¶æ ã詊ãåã«åŸ æ©ããæéïŒã§ãµãŒããããã¬ãŒã«ãŒãåæåããåæç¶æ ãCLOSEDã«èšå®ããŸããcall(self, func, *args, **kwargs): ä¿è·ããã颿°ãã©ããããã¡ã€ã³ã¡ãœããã§ãããµãŒããããã¬ãŒã«ãŒã®çŸåšã®ç¶æ ã確èªããŸããOPENã®å Žåãå埩ã¿ã€ã ã¢ãŠããçµéãããã©ããã確èªããŸããçµéããå ŽåãHALF_OPENã«ç§»è¡ããŸãããã以å€ã®å ŽåãCircuitBreakerErrorãçºçãããŸããç¶æ ãOPENã§ãªãå Žåã颿°ãå®è¡ããæœåšçãªäŸå€ãåŠçããŸããrecord_failure(self): 倱æåæ°ãã€ã³ã¯ãªã¡ã³ããã倱ææå»ãèšé²ããŸãã倱æåæ°ããããå€ãè¶ ãããšããµãŒããããOPENç¶æ ã«ç§»è¡ãããŸããreset(self): 倱æåæ°ããªã»ãããããµãŒããããCLOSEDç¶æ ã«ç§»è¡ãããŸãã
CircuitBreakerErrorã¯ã©ã¹ïŒãµãŒããããã¬ãŒã«ãŒãéããŠãããšãã«çºçããã«ã¹ã¿ã äŸå€ã§ããunreliable_service()颿°ïŒã©ã³ãã ã«å€±æãããµãŒãã¹ãã·ãã¥ã¬ãŒãããŸãã- 䜿çšäŸïŒ
CircuitBreakerã¯ã©ã¹ã䜿çšããŠunreliable_service()颿°ãä¿è·ããæ¹æ³ã瀺ããŸãã
ã«ã¹ã¿ã å®è£ ã«ãããéèŠãªèæ ®äºé ïŒ
- ã¹ã¬ããã»ãŒãïŒ
threading.Lock()ã¯ãç¹ã«äžŠè¡ç°å¢ã§ã¹ã¬ããã»ãŒãã確ä¿ããããã«äžå¯æ¬ ã§ãã - ãšã©ãŒåŠçïŒ
try...exceptãããã¯ã¯ãä¿è·ããããµãŒãã¹ããã®äŸå€ããã£ããããrecord_failure()ãåŒã³åºããŸãã - ç¶æ
é·ç§»ïŒ
CLOSEDãOPENãHALF_OPENç¶æ éã®é·ç§»ããžãã¯ã¯ãcall()ããã³record_failure()ã¡ãœããå ã«å®è£ ãããŠããŸãã
2. ãµãŒãããŒãã£ã©ã€ãã©ãªã®äœ¿çšïŒpybreaker
ç¬èªã®ãµãŒããããã¬ãŒã«ãŒãæ§ç¯ããããšã¯è¯ãåŠç¿çµéšã«ãªããããããŸããããæ¬çªç°å¢ã§ã¯ããããã¹ãããããµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšããæ¹ãè¯ãéžæãšãªãããšããããããŸããPythonã§ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ãå®è£
ããããã®äººæ°ã®ããã©ã€ãã©ãªã®1ã€ã¯pybreakerã§ãã
ã€ã³ã¹ããŒã«ïŒ
pip install pybreaker
䜿çšäŸïŒ
import pybreaker
import time
# Define a custom exception for our service
class ServiceError(Exception):
pass
# Simulate an unreliable service
def unreliable_service():
import random
if random.random() < 0.5:
raise ServiceError("Service failed")
else:
return "Service successful"
# Create a CircuitBreaker instance
circuit_breaker = pybreaker.CircuitBreaker(
fail_max=3, # Number of failures before opening the circuit
reset_timeout=10, # Time in seconds before attempting to close the circuit
name="MyService"
)
# Wrap the unreliable service with the CircuitBreaker
@circuit_breaker
def call_unreliable_service():
return unreliable_service()
# Make calls to the service
for i in range(10):
try:
result = call_unreliable_service()
print(f"Call {i+1}: {result}")
except pybreaker.CircuitBreakerError as e:
print(f"Call {i+1}: Circuit breaker is open: {e}")
except ServiceError as e:
print(f"Call {i+1}: Service failed: {e}")
time.sleep(1)
説æïŒ
- ã€ã³ã¹ããŒã«ïŒ
pip install pybreakerã³ãã³ãã¯ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãã pybreaker.CircuitBreakerã¯ã©ã¹ïŒfail_max: ãµãŒããããã¬ãŒã«ãŒãéãåã®é£ç¶å€±æåæ°ãæå®ããŸããreset_timeout: ãµãŒããããã¬ãŒã«ãŒãããŒããªãŒãã³ç¶æ ã«ç§»è¡ããåã«éãããŸãŸã«ãªãæéïŒç§åäœïŒãæå®ããŸããname: ãµãŒããããã¬ãŒã«ãŒã®ããããããååã§ãã
- ãã³ã¬ãŒã¿ïŒ
@circuit_breakerãã³ã¬ãŒã¿ã¯unreliable_service()颿°ãã©ãããããµãŒããããã¬ãŒã«ãŒããžãã¯ãèªåçã«åŠçããŸãã - äŸå€åŠçïŒ
try...exceptãããã¯ã¯ããµãŒããããéããŠãããšãã«pybreaker.CircuitBreakerErrorããã£ãããããµãŒãã¹ã倱æãããšãã«ServiceErrorïŒã«ã¹ã¿ã äŸå€ïŒããã£ããããŸãã
pybreakerã䜿çšããå©ç¹ïŒ
- å®è£
ã®ç°¡ç¥åïŒ
pybreakerã¯ã¯ãªãŒã³ã§äœ¿ããããAPIãæäŸãããã€ã©ãŒãã¬ãŒãã³ãŒããåæžããŸãã - ã¹ã¬ããã»ãŒãïŒ
pybreakerã¯ã¹ã¬ããã»ãŒãã§ããã䞊è¡ã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããŸãã - ã«ã¹ã¿ãã€ãºå¯èœïŒå€±æãããå€ããªã»ããã¿ã€ã ã¢ãŠããã€ãã³ããªã¹ããŒãªã©ã®ããŸããŸãªãã©ã¡ãŒã¿ãèšå®ã§ããŸãã
- ã€ãã³ããªã¹ããŒïŒ
pybreakerã¯ã€ãã³ããªã¹ããŒããµããŒãããŠããããµãŒããããã¬ãŒã«ãŒã®ç¶æ ãç£èŠããããã«å¿ããŠã¢ã¯ã·ã§ã³ïŒäŸïŒãã®ã³ã°ãã¢ã©ãŒãã®éä¿¡ïŒãå®è¡ã§ããŸãã
3. é«åºŠãªãµãŒããããã¬ãŒã«ãŒã®æŠå¿µ
åºæ¬çãªå®è£ ãè¶ ããŠããµãŒããããã¬ãŒã«ãŒã䜿çšããéã«ã¯ãããã€ãã®é«åºŠãªæŠå¿µãèæ ®ããå¿ èŠããããŸãã
- ã¡ããªã¯ã¹ãšç£èŠïŒãµãŒããããã¬ãŒã«ãŒã®ããã©ãŒãã³ã¹ã«é¢ããã¡ããªã¯ã¹ãåéããããšã¯ããã®åäœãçè§£ããæœåšçãªåé¡ãç¹å®ããããã«äžå¯æ¬ ã§ããPrometheusãGrafanaãªã©ã®ã©ã€ãã©ãªã䜿çšããŠããããã®ã¡ããªã¯ã¹ãèŠèŠåã§ããŸãã以äžã®ã¡ããªã¯ã¹ã远跡ããŸãã
- ãµãŒããããã¬ãŒã«ãŒã®ç¶æ ïŒOpenãClosedãHalf-OpenïŒ
- æåããåŒã³åºãã®åæ°
- 倱æããåŒã³åºãã®åæ°
- åŒã³åºãã®ã¬ã€ãã³ã·
- ãã©ãŒã«ããã¯ã¡ã«ããºã ïŒãµãŒããããéããŠããå Žåããªã¯ãšã¹ããåŠçããããã®æŠç¥ãå¿ èŠã§ããäžè¬çãªãã©ãŒã«ããã¯ã¡ã«ããºã ã«ã¯ä»¥äžãå«ãŸããŸãã
- ãã£ãã·ã¥ãããå€ã®è¿åŽã
- ãŠãŒã¶ãŒã«ãšã©ãŒã¡ãã»ãŒãžã®è¡šç€ºã
- 代æ¿ãµãŒãã¹ã®åŒã³åºãã
- ããã©ã«ãå€ã®è¿åŽã
- éåæãµãŒããããã¬ãŒã«ãŒïŒéåæã¢ããªã±ãŒã·ã§ã³ïŒ
asyncioã䜿çšïŒã§ã¯ãéåæãµãŒããããã¬ãŒã«ãŒå®è£ ã䜿çšããå¿ èŠããããŸããäžéšã®ã©ã€ãã©ãªã¯éåæãµããŒããæäŸããŠããŸãã - ãã«ã¯ãããïŒãã«ã¯ããããã¿ãŒã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®äžéšãåé¢ããŠãããéšåã®é害ãä»ã®éšåã«ã«ã¹ã±ãŒãããªãããã«ããŸãããµãŒããããã¬ãŒã«ãŒã¯ããã«ã¯ããããšçµã¿åãããŠäœ¿çšââããããšã§ãããã«é«ãèé害æ§ãæäŸã§ããŸãã
- æéããŒã¹ã®ãµãŒããããã¬ãŒã«ãŒïŒå€±æåæ°ã远跡ãã代ããã«ãæéããŒã¹ã®ãµãŒããããã¬ãŒã«ãŒã¯ãæå®ãããæéãŠã£ã³ããŠå ã§ä¿è·ãããŠãããµãŒãã¹ã®å¹³åå¿çæéãç¹å®ã®ãããå€ãè¶ ããå Žåã«ãµãŒããããéããŸãã
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
ããã§ã¯ãããŸããŸãªã·ããªãªã§ãµãŒããããã¬ãŒã«ãŒã䜿çšã§ããããã€ãã®å®è·µçãªäŸã瀺ããŸãã
- ãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ïŒãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã§ã¯ããµãŒãã¹ã¯ãã°ãã°äºãã«äŸåããŸãããµãŒããããã¬ãŒã«ãŒã¯ãããŠã³ã¹ããªãŒã ãµãŒãã¹ã§ã®é害ã«ãã£ãŠéè² è·ã«ãªãããšãããµãŒãã¹ãä¿è·ã§ããŸããããšãã°ãeã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã«ã¯ã補åã«ã¿ãã°ã泚æåŠçãæ¯æãåŠççšã®åå¥ã®ãã€ã¯ããµãŒãã¹ãããå ŽåããããŸããæ¯æãåŠçãµãŒãã¹ãå©çšã§ããªããªã£ãå Žåãæ³šæåŠçãµãŒãã¹å ã®ãµãŒããããã¬ãŒã«ãŒã¯ãæ°ããæ³šæãäœæãããã®ãé²ããã«ã¹ã±ãŒãé害ãé²ãããšãã§ããŸãã
- ããŒã¿ããŒã¹æ¥ç¶ïŒã¢ããªã±ãŒã·ã§ã³ãããŒã¿ããŒã¹ã«é »ç¹ã«æ¥ç¶ããå ŽåãããŒã¿ããŒã¹ãå©çšã§ããªããªã£ããšãã®æ¥ç¶ã¹ããŒã ããµãŒããããã¬ãŒã«ãŒãé²ãããšãã§ããŸããå°ççã«åæ£ãããããŒã¿ããŒã¹ã«æ¥ç¶ããã¢ããªã±ãŒã·ã§ã³ãæ€èšããŠãã ããããããã¯ãŒã¯é害ãããŒã¿ããŒã¹ã®ããããã®ãªãŒãžã§ã³ã«åœ±é¿ãäžããå ŽåããµãŒããããã¬ãŒã«ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ãå©çšã§ããªããªãŒãžã§ã³ãžã®æ¥ç¶ãç¹°ãè¿ã詊ã¿ãã®ãé²ããããã©ãŒãã³ã¹ãšå®å®æ§ãåäžãããŸãã
- å€éšAPIïŒå€éšAPIãåŒã³åºãå ŽåããµãŒããããã¬ãŒã«ãŒã¯ãäžæçãªãšã©ãŒãé害ããã¢ããªã±ãŒã·ã§ã³ãä¿è·ã§ããŸããå€ãã®çµç¹ã¯ãããŸããŸãªæ©èœã®ããã«ãµãŒãããŒãã£APIã«äŸåããŠããŸãããµãŒããããã¬ãŒã«ãŒã§APIåŒã³åºããã©ããããããšã«ãããçµç¹ã¯ããå ç¢ãªçµ±åãæ§ç¯ããå€éšAPIé害ã®åœ±é¿ã軜æžã§ããŸãã
- ãªãã©ã€ããžãã¯ïŒãµãŒããããã¬ãŒã«ãŒã¯ããªãã©ã€ããžãã¯ãšé£æºããŠæ©èœã§ããŸãããã ããåé¡ãæªåãããå¯èœæ§ã®ããç©æ¥µçãªãªãã©ã€ãé¿ããããšãéèŠã§ãããµãŒããããã¬ãŒã«ãŒã¯ããµãŒãã¹ãå©çšã§ããªãããšãããã£ãŠããå Žåã«ãªãã©ã€ãé²ãå¿ èŠããããŸãã
ã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ã³ã³ããã¹ãã§ãµãŒããããã¬ãŒã«ãŒãå®è£ ããå Žåãæ¬¡ã®ç¹ãèæ ®ããããšãéèŠã§ãã
- ãããã¯ãŒã¯ã¬ã€ãã³ã·ïŒåŒã³åºãå ãµãŒãã¹ãšåŒã³åºããããµãŒãã¹ã®å°ççãªå Žæã«ãã£ãŠããããã¯ãŒã¯ã¬ã€ãã³ã·ã¯å€§ããç°ãªãå¯èœæ§ããããŸããå埩ã¿ã€ã ã¢ãŠããé©åã«èª¿æŽããŠãã ãããããšãã°ãåç±³ãšãšãŒãããã®ãµãŒãã¹éã®åŒã³åºãã¯ãåããªãŒãžã§ã³å ã®åŒã³åºããããé«ãã¬ã€ãã³ã·ãçµéšããå¯èœæ§ããããŸãã
- ã¿ã€ã ãŸãŒã³ïŒãã¹ãŠã®ã¿ã€ã ã¹ã¿ã³ããç°ãªãã¿ã€ã ãŸãŒã³ã§äžè²«ããŠåŠçãããããšã確èªããŠãã ãããã¿ã€ã ã¹ã¿ã³ãã®ä¿åã«ã¯UTCã䜿çšããŠãã ããã
- ãªãŒãžã§ã³é害ïŒãªãŒãžã§ã³é害ã®å¯èœæ§ãèæ ®ããé害ãç¹å®ã®ãªãŒãžã§ã³ã«éé¢ããããã«ãµãŒããããã¬ãŒã«ãŒãå®è£ ããŠãã ããã
- æåçãªèæ ®äºé ïŒãã©ãŒã«ããã¯ã¡ã«ããºã ãèšèšããéã¯ããŠãŒã¶ãŒã®æåçãªã³ã³ããã¹ããèæ ®ããŠãã ãããããšãã°ããšã©ãŒã¡ãã»ãŒãžã¯ããŒã«ã©ã€ãºãããæåçã«é©åã§ããå¿ èŠããããŸãã
ãã¹ããã©ã¯ãã£ã¹
ãµãŒããããã¬ãŒã«ãŒã广çã«äœ¿çšããããã®ãã¹ããã©ã¯ãã£ã¹ãããã€ã玹ä»ããŸãã
- æ§ãããªèšå®ããå§ããïŒæ¯èŒçäœã倱æãããå€ãšé·ãå埩ã¿ã€ã ã¢ãŠãããå§ããŸãããµãŒããããã¬ãŒã«ãŒã®åäœãç£èŠããå¿ èŠã«å¿ããŠèšå®ã調æŽããŸãã
- é©åãªãã©ãŒã«ããã¯ã¡ã«ããºã ã䜿çšããïŒè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããé害ã®åœ±é¿ãæå°éã«æãããã©ãŒã«ããã¯ã¡ã«ããºã ãéžæããŠãã ããã
- ãµãŒããããã¬ãŒã«ãŒã®ç¶æ ãç£èŠããïŒãµãŒããããã¬ãŒã«ãŒã®ç¶æ ã远跡ãããµãŒããããéããŠãããšãã«éç¥ãããããã«ã¢ã©ãŒããèšå®ããŸãã
- ãµãŒããããã¬ãŒã«ãŒã®åäœããã¹ãããïŒãã¹ãç°å¢ã§é害ãã·ãã¥ã¬ãŒãããŠããµãŒããããã¬ãŒã«ãŒãæ£ããæ©èœããŠããããšã確èªããŸãã
- ãµãŒããããã¬ãŒã«ãŒãžã®é床ã®äŸåãé¿ããïŒãµãŒããããã¬ãŒã«ãŒã¯é害ã軜æžããããã®ããŒã«ã§ããããããã®éå®³ã®æ ¹æ¬åå ã«å¯ŸåŠãã代ããã«ã¯ãªããŸããããµãŒãã¹äžå®å®æ§ã®æ ¹æ¬åå ã調æ»ããŠä¿®æ£ããŸãã
- 忣ãã¬ãŒã·ã³ã°ãæ€èšããïŒåæ£ãã¬ãŒã·ã³ã°ããŒã«ïŒJaegerãZipkinãªã©ïŒãçµ±åããŠãè€æ°ã®ãµãŒãã¹ã«ããããªã¯ãšã¹ãã远跡ããŸããããã«ãããéå®³ã®æ ¹æ¬åå ãç¹å®ãããµãŒããããã¬ãŒã«ãŒãã·ã¹ãã å šäœã«äžãã圱é¿ãçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
çµè«
ãµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ã¯ãèé害æ§ãããå埩åã®ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®è²ŽéãªããŒã«ã§ããã«ã¹ã±ãŒãé害ãé²ããé害ãçºçããŠãããµãŒãã¹ãå埩ããæéã皌ãããšã«ããããµãŒããããã¬ãŒã«ãŒã¯ã·ã¹ãã å®å®æ§ãšå¯çšæ§ã倧å¹
ã«åäžãããããšãã§ããŸããç¬èªã®âå®è£
ãæ§ç¯ããããpybreakerã®ãããªãµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšãããã©ããã«ãããããããµãŒããããã¬ãŒã«ãŒãã¿ãŒã³ã®ã³ã¢ã³ã³ã»ãããšãã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã¯ã仿¥ã®è€éãªåæ£ç°å¢ã§å
ç¢ã§ä¿¡é Œæ§ã®é«ããœãããŠã§ã¢ãéçºããããã«äžå¯æ¬ ã§ãã
ãã®ã¬ã€ãã§æŠèª¬ããååãå®è£ ããããšã«ãããé害ã«å¯ŸããŠããå埩åã®ããPythonã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããã°ããŒãã«ãªãªãŒãã«é¢ä¿ãªããããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãšããå®å®ããã·ã¹ãã ã確ä¿ã§ããŸãã